#include <iostream>
#include <fstream>
#include <vector>
#include <unordered_map>
#include <sstream>
using namespace std;
//用一个单例对象实现对应读取配置文件的封装
//方法一,简单一点，直接把读到的每一行数据都存到vec里面
class Singleton{
public:
    //每当需要单例对象，就返回一个指针
    static Singleton*getInstance(){
        if(_ps){
            return _ps;
        }else{
          _ps=new Singleton(); 
            return _ps;
        }
    }
    //想要实现输入一个键，就可以得到一个值还是每次返回一行？
    //先实现一次性全部返回
    void read(const string & filename){
        ifstream ifs(filename);
        string line;
        if(ifs){
            while(getline(ifs,line)){
            vec.push_back(line);
            }
        }
    }
    void write(){
        for(auto ele:vec){
            cout<<ele<<endl;
        }
    }
    //单例需要把所有可能创造出第二个对象的方法都删除
    Singleton & opeartor(const Singleton& ref)=delete;
    Singleton(const Singleton & ref)=delete;
    vector<string> vec;
   static  Singleton* _ps;
private:
    Singleton(){};
    ~Singleton(){};
};  
Singleton* Singleton::_ps=nullptr;

void test(){
    Singleton::_ps->getInstance();
    //!!!!!!通过一个空指针是可以实现对应成员函数的调用的，但是前提是不能涉及到数据成员
    Singleton::_ps->read("1.txt");
    Singleton:: _ps->write();
}
//方法二
//以键值对的形式，分别存放数据使用的时候只需要输入键就可以了
class Singleton1{
public:
    static Singleton1*getInstance(){
        if(_ps1==nullptr){
            _ps1=new Singleton1();
            return _ps1;
        }
        else{
            return _ps1;
        }
    }
    Singleton1 & operator=(const Singleton1& ref)=delete;
    Singleton1(const Singleton1&rhf)=delete;
    static Singleton1 * _ps1;
    void put(const string & filename){
        ifstream ifs1(filename);
        string line;
        if(!ifs1){
            cout<<"not found"<<endl;
            return ;
        }
        while(getline(ifs1,line)){
            istringstream iss1(line);
            string key;
            iss1>>key;
            string value;
            iss1>>value;
            _up[key]=value;
        } 
    }
    string get(string key){
        return _up[key];
    }
    unordered_map<string,string> _up;
private:
    Singleton1(){};
    ~Singleton1(){};
};
void test2(){
    Singleton1::_ps1->getInstance();
    Singleton1::_ps1->put("1.txt");
    cout<<Singleton1::_ps1->get("ip");
    cout<<endl;
    cout<<Singleton1::_ps1->get("port");
    cout<<endl;
    cout<<Singleton1::_ps1->get("name");
    cout<<endl;
}
Singleton1* Singleton1::_ps1=nullptr;
int main(int argc, char * argv[]){
    test2();
    return 0;
}

